<?php
declare (strict_types=1);

namespace app\admin\controller\admin;

use app\admin\validate\admin\User as UserValidate;
use app\admin\model\admin\User as UserModel;
use app\admin\annotation\common\Auth;
use think\facade\Db;

class User extends BaseUser
{

    /**
     * 添加用户
     * 用于替代生成的代码中同名的方法
     * 可以作为自定义开发的案例参考
     * @return \think\response\Json
     * @throws \Exception
     */
    #[Auth('admin:user:add')]
    public function add(): \think\response\Json
    {
        Db::startTrans();
        try {
            $data = $this->request->post();
            // 验证数据
            validate(UserValidate::class)->scene('add')->check($data);
            // 分离数据
            $roleIds = $data['role_ids'] ?? [];
            unset($data['role_ids']);
            // 创建用户
            $user = UserModel::create($data);
            // 关联角色
            if (!empty($roleIds)) {
                $user->roles()->attach($roleIds);
            }
            Db::commit();
            return $this->success();
        } catch (\think\Exception\ValidateException $ve) {
            Db::rollback();
            return $this->error(['msg' => $ve->getMessage()]);
        } catch (\Exception $e) {
            Db::rollback();
            throw $e;
        }
    }

    /**
     * 更新用户信息
     * 用于替代生成的代码中同名的方法
     * 可以作为自定义开发的案例参考
     * @return \think\response\Json
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     */
    #[Auth('admin:user:update')]
    public function update(): \think\response\Json
    {
        Db::startTrans();
        try {
            $data = $this->request->post();
            // 跳过空的密码
            if(empty($data['password'])){
                unset($data['password']);
            }
            // 验证数据
            validate(UserValidate::class)->scene('update')->check($data);
            // 查询用户
            $user = UserModel::findOrFail($data['id']);
            // 分离数据
            $roleIds = array_key_exists("role_ids", $data) ? $data["role_ids"] : null;
            unset($data['role_ids']);
            // 更新用户
            $user->save($data);
            // 关联角色 同步角色关联，它会处理添加、删除和保留现有关联
            if ($roleIds !== null) {
                $user->roles()->sync($roleIds);
            }
            Db::commit();
            return $this->success();
        } catch (\think\Exception\ValidateException $ve) {
            Db::rollback();
            return $this->error(['msg' => $ve->getMessage()]);
        } catch (\Exception $e) {
            Db::rollback();
            throw $e;
        }
    }



}
